package Model;

import Model.Interface.CollectionUser;
import Model.Interface.ListInterface;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Iterator;

/**
 * 
 * La classe ListUser represente le listes des utilisateurs distants connectés
 * A chaque utilisateur connecté on associe un couple <tt>Nom,@IP</tt>.
 * 
 * @author      Frank Djomo
 * @author      Christelle SIAGO HAPPI
 * @author      djomopoueme@gmail.com
 * @author      christelle.siagohappi@gmail.com
 * @version     1.0
 */


public class ListUser  implements ListInterface,CollectionUser{

    private HashMap<String,InetAddress> hashTable ;

    /**
    * Crée la collection des utilisateurs distants
    */
    public ListUser()
    {
        hashTable= new HashMap<String,InetAddress>() ;
    }   

    /**
    * Ajoute un utilisateur distant à la collection
    * @param login Login de l'utilisateur distant à ajouter
    * @param adress Adresse IP de l'utilisateur distant
    */
    @Override
    public void addElement(String login,Object adress){
         if(!containsName(login))
            hashTable.put(login,(InetAddress)adress);     
    }
    /**
    * Crée un nouvel utlisateur distant à la collection
    * @param login Login de l'utilisateur distant connecté
    * @param adress Adresse IP de l'utilisateur distant    
    */
    @Override
    public void newElement(String login,Object adress) {
        addElement(login,(InetAddress)adress);
    }
    /**
    * Supprime un utilisateur distant de la collection
    * @param login login de l'utilisateur distant à supprimer
    */
    @Override
    public void removeElement(String login){
        if(containsName(login))
            hashTable.remove(login);
    }
    /**
    * Supprime tous les utilisateurs de la collection
    */
    @Override
    public void removeAll() {   
        hashTable.clear();
    //TODO clear Observer
    }   
    /**
    * Retourne le login d'un utilisateur distant à partir de son Adresse IP
    * @param adresse Adresse IP de l'utilisateur distant dont on cherche le login
    * @return Login de l'utilisateur distant qui correspond à l'adresse IP
    */
    @Override
    public String getUsernameByAddress(InetAddress adresse) {
        boolean bFind = false;
        String username=null;

        if(!containsAddress(adresse))
            return username;

        Iterator it = this.iterator();
        while(it.hasNext() && !bFind) {
            username = (String)it.next();
            if(hashTable.get(username).equals(adresse)){
                    bFind= true;
            }			
        }
        return username;
    }
    /**
    * Retourne l'adresse IP d'un utilisateur distant à partir de son login
    * @param login     Nom de l'utilisateur distant dont on cherche l'adresse IP
    * @return Adresse IP de l'utilisateur qui correspond au login
    */
    @Override
    public InetAddress getAddressByName(String login) {
        return hashTable.get(login);
    }
    /**
    * Teste si le login recherché fait partie de la liste
    * @param login      Login de l'utilisateur recherché
    * @return Résultat de la recherche 
    *         <code>true</code> si login existe
    *         <code>false</code> sinon
    */
    @Override
    public boolean containsName(String login){
        return (hashTable.containsKey(login)) ;
    }
    /**
    * Teste si l'adresse IP recherchée fait partie de la liste
    * @param adresse Adresse IP de l'utilisateur recherché
    * @return  Résultat de la recherche (vrai ou faux)
    *          <code>true</code> si adresse existe
    *          <code>false</code> sinon
    */
    @Override
    public boolean containsAddress(InetAddress adresse){
        return (hashTable.containsValue(adresse)) ;
    }
    /**
    * Retourne un iterateur
    * @return Iterateur sur la collection
    */
    @Override
    public Iterator iterator() {
        Iterator<String> it = hashTable.keySet().iterator();
        return it;
    }
   
}
